#include "Kopiec.hh"
#include <string.h>
#include <sys/time.h>

void Kopiec:: exch (int &a, int &b)	//zamiana a z b exchange wymiana
{
	int tmp = a;
	a = b;
	b = tmp;
}

void Kopiec:: upheap (int t[], int k)
{
	while (k>1 && t[k/2] < t[k])
	{
		exch (t[k], t[k/2]);
		k = k/2;
	}
}

void Kopiec:: downheap (int t[], int k, int n)
{
	int j = 2*k ;
	while (j <= n)
	{
		if (j < n && t[j] < t[j+1]) j++;
		if (t[k] >= t[j]) break;
		exch (t[k], t[j]);
		k = j; j = 2*k;
	}
}


void Kopiec:: insert (int e)
{
	if(n>0&&n>=(rozmiar-1)){
		int* tmptab=new int[rozmiar+rozmiar/2];
		memcpy(tmptab,t,sizeof(int)*rozmiar);
		delete[] t;
		t=tmptab;
		rozmiar+=rozmiar/2;
	}
	t[++n] = e ;  //wstawiam na sam koniec i zwiekszam n
	upheap (t, n) ;
}

int Kopiec:: max()
{
	return t[1] ;
}

void Kopiec:: deletemax()
{
	if(n>0){
		t[1] = t[n];
		n--;
		downheap(t, 1, n);
		if(n>10&&n<(rozmiar*0.2)){
			int* tmptab=new int[rozmiar/2];
			memcpy(tmptab,t,sizeof(int)*n);
			delete[] t;
			t=tmptab;
			rozmiar/=2;
		}
	} else {
		cerr << "\n[ KOPIEC JEST JUZ PUSTY !!!]\n";
	}
}

void Kopiec:: wyczysc(){
	while(n>0){
		deletemax();
	}
}

void Kopiec:: heap()
{
	n=0;
	rozmiar=0;
	if(t!=NULL){
		delete[] t;
	}
	t=new int[1000];
	rozmiar=1000;
}

void Kopiec::tab()
{
	int m;
	cout << "Podaj ilosc elementow tablicy\n";
	cin>>m;
	if(cin.fail() || n<0){cerr << "Blad to nie jest liczba lub podales liczbe <0!\n"; exit(1);}
	else
	{
		t=new int[m];
		rozmiar=m;

	}
}
void Kopiec:: poka()
{
	if(n>0){
		cout<<"Oto kopiec\n";
		for ( int i = 1; i <= n; ++i )
		{
			cout<<t[i]<<";";
		}
		cout<<"\n";
	} else {
		cerr << "\n [ KOPIEC JEST PUSTY ]\n";
	}
}




